package n3_临界区critical_zone;

import lombok.extern.slf4j.Slf4j;

import static utils.Sleeper.sleep;

/**
 * 下面 a() 和 b()方法中 锁住的 是 [Number对象]
 * 所以 a() 和 b()方法 互斥，要么a先执行要么b先执行
 *
 * main方法 使用两个对象执行   【没有互斥 所以是并行执行】
 */
@Slf4j(topic = "c.T3_locks_synchronized")
public class T4_互斥_关键字synchronized {

    public static void main(String[] args) {

        Number2 n1 = new Number2();
        Number2 n2 = new Number2();
        new Thread(()->{
            log.debug("线程1 开始。。。。。。");
            n1.a();
        }).start();

        new Thread(()->{
            log.debug("线程2 开始。。。。。。");

//<<<<<<<<<<<<<HEAD
//            n2.b(); // 这里锁的不是同一个对象，将不会互斥
//=================
            n1.b();   // 锁的是同一个对象，互斥
//>>>>>>>>>>>>>END
        }).start();

        new Thread(()->{
            log.debug("线程3 开始。。。。。。");

            n1.c();
        }).start();

    }


}


@Slf4j(topic = "c.Number2")
class Number2{
    public synchronized void a() {
        sleep(5);
        log.debug("a 方法结束。。。。。。");
    }
    public synchronized void b() {
        sleep(3);
        log.debug("b 方法结束。。。。。。");

    }
    // c方法 没被锁 直接 并行运行
    public void c() {
        sleep(3);
        log.debug("c 方法结束。。。。。。");

    }
}



